#ifndef __THREAD_HPP
#define __THREAD_HPP

#include <iostream>
#include <string>
#include <pthread.h>
#include <functional>
using namespace std;

class Thread
{
    using func_t = std::function<void(const string &)>;

public:
    Thread(func_t func, const std::string &name = "default_thread")
        : _func(func), _threadname(name), _stop(true)
    {
    }
    static void *threadfunc(void *arg) // 真正的线程函数
    {
        Thread *_this = static_cast<Thread *>(arg);

        _this->_func(_this->_threadname);

        return nullptr;
    }
    bool start() // 创建线程，让线程开始
    {
        int n = pthread_create(&_tid, nullptr, threadfunc, this);

        if (!n)
        {
            _stop = false;
            return true;
        }
        else
        {
            return false;
        }
    }
    void join() // 等待所有线程
    {
        if (!_stop)
            pthread_join(_tid, nullptr);
    }
    void detach() // 分离所有线程
    {
        if (!_stop)
            pthread_detach(_tid);
    }

    const std::string &name() const
    {
        return _threadname;
    }
    pthread_t id() const
    {
        return _tid;
    }

private:
    pthread_t _tid;     // 线程 id
    string _threadname; // 线程的名字
    func_t _func;       // 线程函数
    bool _stop;         // 标明线程是运行状态还是停止状态/线程创建失败
};

#endif